#include "pro_switch.h"
#include "key.h"
#include "rte.h"
#include "gpio.h"
#include "lock_uart.h"
#include "nfc_ctrl.h"
#include "nfc_read_switch.h"
#include "nfc_read_card.h"
#include "ver_comp.h"
typedef struct
{
    Rt_result (*server)(void);
} AppServer_t;

static bool Overcurrent_only_once = false; /*每个产品只进行一次过流保护*/
static bool FAIL_error = false; /*是否出现错误*/
static bool Stable_buttons = true;/*不良品次按键最开始为稳定状态*/

static AppServer_t serverList[CURR_MAX] = {
    {EHBL_functional_test},    /*方向锁*/
    {Nfc_read_product_switch}, /*NFC读卡器*/
    {NFCCTRL_functional_test}  /*NFC控制器*/
};

/*
 * 函数介绍: 不良品次按键初始化
 * 参数:
 * 返回值: {*}
 * 备注:此函数要放在应用初始化中
 */
void pro_switch_init(void)
{
    Overcurrent_only_once = false; /*每个产品只进行一次过流保护*/
    FAIL_error = false; /*是否出现错误*/
    Stable_buttons = true;/*不良品次按键最开始为稳定状态*/
}

/*
 * 函数介绍: 设置过流保护调用状态
 * 参数:
 * 返回值: {*}
 * 备注:此函数要放在应用初始化中
 */
void set_Overcurrent_only_once(bool bl)
{
    Overcurrent_only_once = bl;
}

/*
 * 函数名称：Product_testing_completed
 * 函数功能：当前产品测试结束，调用应用层初始化
 * 参数：
 *   - result：测试结果，类型为Rt_result，枚举类型，表示测试成功或失败
 * 返回值：无
 * 备注：此函数应放置在应用初始化阶段调用
 */
void Product_testing_completed(Rt_result result)
{
    volatile static unsigned int start_debounceCounter = 0; /* 用于不良品次按键消抖的时间计数器 */
    Curr_produ index = rt_Curr_produ();
    NFCTestStatus Status;
    if (CARD_READER == index)
    {
        if (READ_CARD == Nfc_get_read())
        {
            Status = NFC_READER_TEST;/* code */
        }else if (TEST_CARD == Nfc_get_read())
        {
            Status = NFC_CARD_READER_TEST;/* code */
        }
    }else if (CONTROLLER == index)
    {
        Status = NFC_CONTROLLER_TEST;/* code */
    }
    
    
    // 测试成功，调用应用层初始化并返回
    if (TEST_OK == result)
    {
        if (STEERING_LOCK != index/* condition */)
        {
            RTE_UART7_LCD_SHOW(Status,SUCC_ITEMS_ADD,STATUS_QUALIFIED);
        }
        /*测试合格*/
        MX_GPIO_Init();
        RTE_APP_INIT();
        RTE_LED_BUZZ(LED_GREEN,1);
        return ;
    }

    // 测试失败，设置标志等待按下不良品次按键才能继续测试
    if (TEST_FAIL == result)
    {
        if (STEERING_LOCK != index/* condition */)
        {
            RTE_UART7_LCD_SHOW(Status,FAIL_ITEMS_ADD,STATUS_QUALIFIED);
        }
        /*测试不合格*/
        RTE_LED_BUZZ(LED_RED,3);
        FAIL_error = true;
        Nfc_read_product_switch_init();
    }

    // 当有测试失败且检测到按下不良品次按键时的处理逻辑
    if (true == FAIL_error && GPIO_PIN_RESET == RTE_GPIO_PIN_GET_LEVEL(GPIOC,PhotoElectricSW_I_PC10_Pin))
    {
        // 按键消抖逻辑
        if (true == Stable_buttons)
        {
            Stable_buttons = false; /* 设置为不稳定状态，需要消抖确定按键是否真正按下 */
            start_debounceCounter = RTE_GET_TIMER(); /* 开始消抖计时 */
        }
        else if(RTE_TIMEOUT_JUDGMENT(start_debounceCounter,DEBOUNCE_TIME_MS))
        {
            // 消抖时间结束后，再次确认按键状态，若仍按下则调用应用层初始化
            RTE_APP_INIT();
        }
    }
}

/*
 * 函数介绍: 三种产品三种程序切换
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Program_switch(void)
{
    Curr_produ index = CURR_MAX;
    Rt_result result = TEST_WAIT; /*返回值*/
    if (DURING_TEST == rt_test_status())
    {
        if (TEST_CARD == Nfc_get_read() && CARD_READER == rt_Curr_produ())
        {
            /* 测试NFC卡，不走电流保护 */
            result = NFCRC_swipe();
        }
        else if( (READ_CARD == Nfc_get_read() && CARD_READER == rt_Curr_produ())|| \
        STEERING_LOCK == rt_Curr_produ()|| \
        CONTROLLER == rt_Curr_produ())
        {
            index = rt_Curr_produ();
            result = Overcurrent_protection_checking(); /*检测一次过流保护程序通过与否*/
            if (true == Overcurrent_only_once && CURR_MAX > index)
            {
                result = serverList[index].server(); /*调用相应的产品测试程序*/
            }
        }
    }
    Product_testing_completed(result); /*当前产品测试结束，调用应用层初始化*/
    //RTE_ADC2_LOOP_TRIG();
    RTE_UART_MAIN();
    ver_comp_main();
}
